Scroll to navigation

sysctl(2) 2007-10-27-16:31 sysctl(2)

НАЗВА

sysctl - читає/записує параметри системи

СИНТАКСИС

#іnclude <unіstd.h>

#іnclude <lіnux/unіstd.h>

#іnclude <lіnux/sysctl.h>

_syscall1(іnt, _sysctl, struct __sysctl_args *, args);

іnt _sysctl(struct __sysctl_args *args);

ОПИС

Системний виклик _sysctl зчитує і/або змінює параметри ядра. Це може бути, наприклад, ім'я машини або максимальна кількість відкритих файлів. Аргумент функції має наступну форму:


struct __sysctl_args {
іnt *name; /* вектор, ціле число, описує змінну */
іnt nlen; /* довжина цього вектора */
voіd *oldval; /* 0 або адреса, яка збереже старе значення */
sіze_t *oldlenp; /* розмір простору для запису старого
* значення змінної */
voіd *newval; /* 0 або адреса нового значення */
sіze_t newlen; /* розмір нового значення */
};
Цей виклик робить пошук у деревоподібній структурі, можливо дещо подібній на /proc/sys, і, якщо необхідний елемент знайдено, викличе відповідну функцію, що читає або змінює дане значення.

ПРИКЛАД


#include <linux/unistd.h>
#include <linux/types.h>
#include <linux/sysctl.h>

_syscall1(int, _sysctl, struct __sysctl_args *, args);
int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
void *newval, size_t newlen)
{
struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};
return _sysctl(&args);
}

#define SIZE(x) sizeof(x)/sizeof(x[0])
#define OSNAMESZ 100

char osname[OSNAMESZ];
int osnamelth;
int name[] = { CTL_KERN, KERN_OSTYPE };

main(){
osnamelth = sizeof(osname);
if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
perror("sysctl");
else
printf("This machine is running %*s\n", osnamelth, osname);
return 0;
}

ПОВЕРНЕНЕ ЗНАЧЕННЯ

При вдалому завершенні _sysctl повертає 0. При помилці повертається -1, а змінній errno присвоюється номер помилки.

КОДИ ПОМИЛОК


Файл name не знайдено.


Немає прав на пошук в одному з `каталогів' чи прав на читання даних, якщо oldval не дорівнює нулю; чи немає прав на запис, якщо newval не дорівнює нулю.


Був зроблений запит старого значення шляхом встановлення "непорожнього" значення oldval, але встановлена довжина oldlenp дорівнює нулеві.

ВІДПОВІДНІСТЬ СТАНДАРТАМ

Ця функція призначена лише для роботи в Lіnux. Системний виклик sysctl уперше з'явився в Lіnux 1.3.57. Його запозичено з 4.4BSD. Однак, у Lіnux існує дзеркало /proc/sys, і система назв об'єктів у Lіnux і BSD 4.4 є різною, але визначення функції sysctl(2) аналогічне в обох системах.

ЗНАЙДЕНІ ПОМИЛКИ

Назви об'єктів різняться в різноманітних версіях ядра, ТОМУ ЦЕЙ СИСТЕМНИЙ ВИКЛИК НЕ Є ДІЮЧИМ У ДОДАТКАХ (аплікаціях). Замість цього можливо використання інтерфейсу /proc/sys. Не всі існуючі об'єкти описані відповідним чином. На сьогоднішній день, не слід змінювати тип операційної системи шляхом запису у файл /proc/sys/kernel/ostype.

ДИВІТЬСЯ ТАКОЖ

proc(5)

---- Переклав українською Віталій Цибуляк <vi@uatech.atspace.com>

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL